#include<iostream>
#include<vector>
using namespace std;
/*
给你一个字符串 s ，请你统计并返回这个字符串中 回文子串 的数目。
回文字符串 是正着读和倒过来读一样的字符串。
子字符串 是字符串中的由连续字符组成的一个序列。
解题思路：
首先要明确如何定义dp数组,dp[i][j]表示下标为i-j的范围内的字符串是否是回文串
如果s[i]==s[j]时，要分为三种情况，i==j时，此时范围内只有一个元素，故是回文串
当j-i==1时，此时范围内只有两个元素，且是两个相同的元素，此时也是一个回文串
当j-i>1时要依据前面的状态进行判断，例如：s=asbca，此时i=0，j=4，要判断i-j是否是回文串要判断i+1到j-1是否是回文串
所以有递推公式：
if(j-i<=1)
    dp[i][j] = true;
else 
    dp[i][j] = dp[i+1][j-1]
由于dp数组的状态要依赖于前一列和下一行的状态，所以遍历顺序要从左往右从下往上进行遍历,并且初始化为false
*/
int dp(string s)
{
    //创建dp数组
    vector<vector<bool>> dp(s.size(),vector<bool>(s.size(),false));
    int result=0;
    for(int i=s.size()-1;i>=0;i--)
    {
        for(int j=i;j<s.size();j++)
        {
            if(s[i]==s[j])
            {
                if(j-i<=1)
                {
                    dp[i][j] = true;
                    result++;
                }
                else if(dp[i+1][j-1])
                {
                dp[i][j] = true;
                result++;
                }
            }
            else
                dp[i][j] = false;
        }
    }
    return result;
}
int main()
{
    cout<<"enter a s:"<<endl;
    string s;
    cin>>s;
    cout<<dp(s);
    return 0;
}